/*
数据结构 解题报告：
http://git.oschina.net/et0662/sznoi-Data_Structure
*/
#include<stdio.h>
#include<math.h>

typedef struct _Node
{
	int data;
	struct _Node* left;
	struct _Node* right;
}Node, *ptrNode, Tree, *ptrTree;

/*先序*/
void lpt(ptrTree t)
{
	if(t)
	{
		printf("%d ",t->data);
		lpt(t->left);
		lpt(t->right);
	}
}

/*后序*/
void rpt(ptrTree t)
{
	if(t)
	{
		rpt(t->left);
		rpt(t->right);
		printf("%d ",t->data);
	}
}

/*中序*/
void mpt(ptrTree t)
{
	if(t)
	{
		mpt(t->left);
		printf("%d ",t->data);
		mpt(t->right);
	}
}

void emptyTree(ptrTree t)
{
	if(t)
	{
		emptyTree(t->left);
		emptyTree(t->right);
		delete(t);
	}
}

int main(void)
{
	ptrNode* a;
	ptrNode p;
	ptrTree t=NULL;
	int deep, nNode;
	int i,j,temp, ss;
	
	scanf("%d%d",&deep,&ss);	//读入书的深度 和 顺序
	nNode=pow(2,deep)-1; //计算满两叉树结点数
	
	a=new ptrNode[nNode];
	a[0]=NULL;

	/*读入去重复*/
	i=0;
	while(i!=nNode)
	{
		scanf("%d",&temp);
		for(j=0;j<i;j++)
		{
			if(a[j]->data==temp)
				break;
		}
		if(j!=i)
			continue;
		p=new Node;
		p->left=NULL;
		p->right=NULL;
		p->data=temp;
		a[i]=p;
		i++;
	}

	
	/*构建树*/
	i=0;j=1;
	t=a[0];
	p=t;
	while(j<nNode)
	{
		if(p)
		{
			p->left=a[j++];
			p->right=a[j++];
			i++;
			p=a[i];
		}
	}

	if(ss==1)
		lpt(t);		//先序
	else if(ss==2)
		mpt(t);   //中序
	else
		rpt(t);		//后序

	//释放空间
	emptyTree(t);
	delete(a);

	return 0;
}
